/* eslint-disable class-methods-use-this */
import { ResponseType } from '@/shared/interfaces';
import { CheckEmailResponseDto, PasswordCheckDto, TokenDTO, UserWithProfileV2Dto } from '@/shared/interfaces/generated';
import request from '@api';

export class AuthApi {
  // Обновление последней активности авторизованного пользователя
  async updateLastActivity(id: number) {
    const ans = await request(`/users/${id}:update-activity`, 'POST');
    return ans;
  }

  async changeOldPassword(data: { oldPassword: string; newPassword: string }) {
    const ans = await request('/user/login-details/change', 'POST', data);
    return ans;
  }

  async signInSocial(code: string) {
    const ans = await request<TokenDTO>(`/auth/signin/oauth/callback?code=${code}`, 'PUT');
    return ans;
  }

  async sendFeedbackMessage(data: FormData, noAuth: boolean) {
    const ans = await request(
      !noAuth ? '/user/send-feedback-unauth' : '/user/send-feedback',
      !noAuth ? 'POST' : 'PUT',
      data,
      {
        'Content-Type': 'multipart/form-data',
      },
    );
    return ans;
  }

  // Вход через социальную сеть
  async signInSocialRedirect(social: string) {
    const ans = await request(`/auth/signin/oauth/${social}`, 'GET');
    return ans;
  }

  // Авторизация по почте
  async authByEmail(data: { email: string; password: string }) {
    const ans = await request<TokenDTO>('/auth/email/singin', 'POST', data);
    return ans;
  }

  // Получить тип авторизации
  async getAuthType() {
    const ans = await request<Pick<UserWithProfileV2Dto, 'authType'>>('/user/auth-type', 'GET');
    return ans;
  }

  // Получить новую пару токенов
  async refreshToken(refreshToken: string) {
    const ans = await request<TokenDTO>(`/auth/refresh-token?refreshToken=${refreshToken}`, 'PUT');
    return ans;
  }

  // Получить новый пароль на почту
  async restorePassword(data: { email: string }) {
    const ans = await request<TokenDTO>('/auth/email/restore', 'POST', data);
    return ans;
  }

  // Регистрация по почте
  async registrationByEmail(data: { email: string; password: string }) {
    const ans = await request<TokenDTO>('/auth/email/register', 'POST', data);
    return ans;
  }

  // Разлогин
  async signOut() {
    const ans = await request('/auth/signout', 'PUT');
    return ans;
  }

  // Проверить, зарегистрирован ли на почту аккаунт
  async checkEmailExist(email: string) {
    const ans = await request<CheckEmailResponseDto>(`/auth/email/check?email=${email}`, 'GET');
    return ans;
  }

  // Подтвердить изменение типа авторизации на авторизацию по почте и паролю
  async changeAuthType(data: { password: string }) {
    const ans = await request<ResponseType>('/user/auth-type/email/change', 'POST', JSON.stringify(data));
    return ans;
  }

  // Проверить, совпадает ли введенный пароль с актуальным паролем
  async checkPassword(data: { password: string }) {
    const ans = await request<PasswordCheckDto>('/user/password/check', 'POST', data);
    return ans;
  }
}
